package com.ruoyi.common.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

//import org.apache.commons.lang.time.DateUtils;


import com.ruoyi.common.utils.StringUtils;

/**
 * 日期与时间工具类<br>
 * <br>
 * ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ <br>
 * 描述 <br>
 * ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br>
 * G Era 标志符 Text AD <br>
 * y 年 Year 1996; 96 <br>
 * M 年中的月份 Month July; Jul; 07 <br>
 * w 年中的周数 Number 27 <br>
 * W 月份中的周数 Number 2 <br>
 * D 年中的天数 Number 189 <br>
 * d 月份中的天数 Number 10 <br>
 * F 月份中的星期 Number 2 <br>
 * E 星期中的天数 Text Tuesday; Tue <br>
 * a Am/pm 标记 Text PM <br>
 * H 一天中的小时数（0-23） Number 0 <br>
 * k 一天中的小时数（1-24） Number 24 <br>
 * K am/pm 中的小时数（0-11） Number 0 <br>
 * h am/pm 中的小时数（1-12） Number 12 <br>
 * m 小时中的分钟数 Number 30 <br>
 * s 分钟中的秒数 Number 55 <br>
 * S 毫秒数 Number 978 <br>
 * z 时区 General time zone Pacific Standard Time; PST; GMT-08:00 <br>
 * Z 时区 RFC 822 time zone -0800 <br>
 * ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━<br>
 * */
public class DateTools extends DateUtils{

	/**
	 * 格式化类型：年月日（yyyy-MM-dd）
	 * */
	public static final String yyyy_MM_dd = "yyyy-MM-dd";
	/**
	 * 格式化类型：xxxx年xx月xx日
	 * */
	public static final String $yyyy_MM_dd = "yyyy年MM月dd日";
	/**
	 * 格式化类型：年月日（yyyyMMdd）
	 * */
	public static final String yyyyMMdd = "yyyyMMdd";
	/**
	 * 格式化类型：年月日时分秒（yyyy-MM-dd HH:mm:ss）
	 * */
	public static final String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";
	
	public static final String yyyy_MM_dd_HH_mm = "yyyy-MM-dd HH:mm";
	/**
	 * 格式化类型：年月日时分秒（yyyyMMddHHmmss）
	 * */
	public static final String yyyyMMddHHmmss = "yyyyMMddHHmmss";
	
	/**
	 * 转换类型：yyyy年MM月dd日  HH:mm:ss
	 * */
	public static final String nian_yue_ri_shi_fen_miao="yyyy年MM月dd日  HH:mm:ss";

	private DateTools() {
	}

	/**
	 * 获取格式化日期字符串
	 * 
	 * @param date
	 *            日期对象
	 * @param type
	 *            格式化方式，参考：DateTools的静态常量
	 * @author BraveHeartWzm
	 * 
	 * */
	public static String getFormatDate(Date date, String type) {
		String ret = null;
		if (null == date) {
			return null;
		} else {
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat(type);
			ret = simpleDateFormat.format(date);
			simpleDateFormat = null;
		}
		return ret;
	}

	public static Date getFromDayBegin(Date date){
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.set(Calendar.HOUR_OF_DAY, 0);
		c.set(Calendar.MINUTE,0);
		c.set(Calendar.SECOND, 0);
		return c.getTime();
	}
	public static Date getFromDayEnd(Date date){
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.set(Calendar.HOUR_OF_DAY, 23);
		c.set(Calendar.MINUTE,59);
		c.set(Calendar.SECOND, 59);
		return c.getTime();
	}
	/**
	 * 获取当前的格式化日期字符串
	 * 
	 * @param type
	 *            格式化方式，参考：DateTools的静态常量
	 * @author BraveHeartWzm
	 * */
	public static String getCurrentFormatDate(String type) {
		return getFormatDate(new Date(), type);
	}

	/**
	 * 字符串转换日期
	 * */
	public static Date toDate(String dateStr, String type) {
		SimpleDateFormat format = new SimpleDateFormat(type);
		try {
			return format.parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
			System.out.println("日期转换异常");
		}
		return null;
	}

	/**
	 * 获取当前时间 年月 yyyyMM
	 * 
	 * @return 如：201312
	 * @author wangwei 2013-12-31
	 */
	public static String getYM() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
		String YM = sdf.format(new Date());
		return YM;
	}
	public static String getYearString() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
		String YM = sdf.format(new Date());
		return YM;
	}

	/**
	 * 获取当前时间的年月日
	 * 
	 * @return
	 */
	public static String getYMD() {
		SimpleDateFormat sdf = new SimpleDateFormat($yyyy_MM_dd);
		String YMD = sdf.format(new Date());
		return YMD;
	}
	
	public static String getYMDhms() {
		SimpleDateFormat sdf = new SimpleDateFormat(yyyy_MM_dd_HH_mm_ss);
		String YMD = sdf.format(new Date());
		return YMD;
	}

	/**
	 * 获取当前时间 年月日时分秒 yyyyMMddHHmmss
	 * 
	 * @return
	 * 
	 * @author WangWei 2014-1-8
	 */
	public static String getYmdhms() {
		SimpleDateFormat sdf = new SimpleDateFormat(nian_yue_ri_shi_fen_miao);
		String YM = sdf.format(new Date());
		return YM;
	}

	public static String date2Ym(String strDate) {
		DateFormat gmtFormat = new SimpleDateFormat("yyyyMM");
		TimeZone cstTime = TimeZone.getTimeZone("CST");
		gmtFormat.setTimeZone(cstTime);
		return gmtFormat.format(new Date(strDate));
	}

	// 当前时间
	public static String nowTime() {

		Date d = new Date();
		// 获取时间
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 转换格式
		return sdf.format(d).toString();

	}

	/**
	 * 获取时间序列ID 日期格式：yyyyMMddHHmmss
	 * */
	public static String getDateSeqId1(String head, String seq) {
		StringBuffer buffer = new StringBuffer();
		if (null != head && !"".equals(head)) {
			buffer.append(head);
		}
		// 获取时间
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		buffer.append(sdf.format(new Date()).toString());
		buffer.append(seq);
		return buffer.toString();
	}

	/**
	 * 获取时间序列ID 日期格式：yyMMddHHmmss
	 * */
	public static String getDateSeqId2(String head, String seq) {
		StringBuffer buffer = new StringBuffer();
		if (null != head && !"".equals(head)) {
			buffer.append(head);
		}
		// 获取时间
		SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
		buffer.append(sdf.format(new Date()).toString());
		buffer.append(seq);
		return buffer.toString();
	}

	/**
	 * 获取时间序列ID 日期格式：yyyyMMdd
	 * */
	public static String getDateSeqId3(String head, String seq) {
		StringBuffer buffer = new StringBuffer();
		if (null != head && !"".equals(head)) {
			buffer.append(head);
		}
		// 获取时间
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		buffer.append(sdf.format(new Date()).toString());
		buffer.append(seq);
		return buffer.toString();
	}

	// ===================================================

	public static void main(String[] args) {
		System.out.print(getFromDayEnd(new Date()));
	}
	
	public static int getYear(){
		Date now = new Date();
		Calendar c = Calendar.getInstance();
		c.setTime(now);
		return c.get(Calendar.YEAR);
	}
	
	public static Date parseDate(String date,String format){
		if(StringUtils.isBlank(date))
			return null;
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		try {
			return sdf.parse(date);
		} catch (ParseException e) {
			return null;
		}
	}
	
	public static int compareDate(Date date1,Date date2){
		if(date1.getTime() > date2.getTime())
			return 1;
		if(date1.getTime() < date2.getTime())
			return -1;
		return 0;
	}
	
	public static String getCompareBornDate(int years){
		Date date = DateTools.addYears(new Date(), - years);
		return DateTools.getFormatDate(date, "yyyyMMdd");
	}

	public static int diffIndays(Date end,Date start){
		long different = end.getTime() - start.getTime();
		long secondsInMilli = 1000;
        long minutesInMilli = secondsInMilli * 60;
        long hoursInMilli = minutesInMilli * 60;
        long daysInMilli = hoursInMilli * 24;
        long elapsedDays = different / daysInMilli;
        return (int)elapsedDays;
	}
	
	public static String convertDateSdf(String str) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat(
				"EEE MMM dd HH:mm:ss z yyyy", Locale.US);
		Date date = sdf.parse(str);
		sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(date);
	}
	
	public static String plusDay(int num, String newDate) throws ParseException {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date currdate = format.parse(newDate);
		System.out.println("现在的日期是：" + currdate);
		Calendar ca = Calendar.getInstance();
		ca.add(Calendar.DATE, num);// num为增加的天数，可以改变的
		currdate = ca.getTime();
		String enddate = format.format(currdate);
		System.out.println("增加天数以后的日期：" + enddate);
		return enddate;
	}
}
